<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>

<body>
<div>
  <p>将log信息记录到文件应该说是日志系统的一个基本功能，log4cplus在此基础上，提供了更多的功能，可以按照你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新文件中，依次类推；或者按照日期来决定是否转储。本文将详细介绍这些用法。</p>
  <br />
  <pre>				<br />### 如何将log记录到文件 ###</pre>
  <pre>我们在例5中给出了一个将log记录到文件的例子，用的是FileAppender类实现的，log4cplus提供了三个类用于<br />文件操作，它们是FileAppender类、RollingFileAppender类、DailyRollingFileAppender类。</pre>
  <pre>1. FileAppender类</pre>
  <pre>实现了基本的文件操作功能，构造函数如下：</pre>
  <pre>FileAppender(const log4cplus::tstring&amp; filename,<br />                     LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,<br />                     bool immediateFlush = true);<br />                     <br />filename       : 文件名<br />mode           : 文件类型，可选择的文件类型包括app、ate、binary、in、out、trunc，因为实际上只是对<br />                 stl的一个简单包装，呵呵，这里就不多讲了。缺省是trunc，表示将先前文件删除。<br />immediateFlush ：缓冲刷新标志，如果为true表示每向文件写一条记录就刷新一次缓存，否则直到FileAppender<br />                 被关闭或文件缓存已满才更新文件，一般是要设置true的，比如你往文件写的过程中出现<br />                 了错误（如程序非正常退出），即使文件没有正常关闭也可以保证程序终止时刻之前的所有<br />                 记录都会被正常保存。</pre>
  <pre>FileAppender类的使用情况请参考例5，这里不再赘述。</pre>
  <pre>				<br />2. RollingFileAppender类</pre>
  <pre>构造函数如下：<br />log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring&amp; filename,<br />                                                    long maxFileSize,<br />                                                    int maxBackupIndex,<br />                                                    bool immediateFlush)</pre>
  <pre>filename       : 文件名<br />maxFileSize    : 文件的最大尺寸<br />maxBackupIndex : 最大记录文件数<br />immediateFlush : 缓冲刷新标志<br />                                                    <br />RollingFileAppender类可以根据你预先设定的大小来决定是否转储，当超过该大小，后续log信息会另存到新<br />文件中，除了定义每个记录文件的大小之外，你还要确定在RollingFileAppender类对象构造时最多需要多少个<br />这样的记录文件(maxBackupIndex+1)，当存储的文件数目超过maxBackupIndex+1时，会删除最早生成的文件，<br />保证整个文件数目等于maxBackupIndex+1。然后继续记录，比如以下代码片段：</pre>
  <pre>    ... ...<br />    <br />    #define LOOP_COUNT 200000<br />    <br />    SharedAppenderPtr _append(new RollingFileAppender(&quot;Test.log&quot;, 5*1024, 5));<br />    _append-&gt;setName(&quot;file test&quot;);<br />    _append-&gt;setLayout( std::auto_ptr(new TTCCLayout()) );<br />    Logger::getRoot().addAppender(_append);</pre>
  <pre>    Logger root = Logger::getRoot();<br />    Logger test = Logger::getInstance(&quot;test&quot;);<br />    Logger subTest = Logger::getInstance(&quot;test.subtest&quot;);</pre>
  <pre>    for(int i=0; i    {<br />        NDCContextCreator _context(&quot;loop&quot;);<br />        LOG4CPLUS_DEBUG(subTest, &quot;Entering loop #&quot; &lt;&lt; i)<br />    }<br />    <br />    ... ...<br />    </pre>
  <pre>运行结果：</pre>
  <pre>运行后会产生6个输出文件，Test.log、Test.log.1、Test.log.2、Test.log.3、Test.log.4、Test.log.5<br />其中Test.log存放着最新写入的信息，而最后一个文件中并不包含第一个写入信息，说明已经被不断更新了。<br />需要指出的是，这里除了Test.log之外，每个文件的大小都是200K,而不是我们想像中的5K，这是因为<br />log4cplus中隐含定义了文件的最小尺寸是200K，只有大于200K的设置才生效，&lt;= 200k的设置都会被认为是<br />200K.</pre>
  <pre>				<br />3. DailyRollingFileAppender类</pre>
  <pre>构造函数如下：<br />DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring&amp; filename,<br />                                                   DailyRollingFileSchedule schedule,<br />                                                   bool immediateFlush,<br />                                                   int maxBackupIndex)<br />                                                   <br />filename       : 文件名<br />schedule       : 存储频度<br />immediateFlush : 缓冲刷新标志<br />maxBackupIndex : 最大记录文件数</pre>
  <pre>DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储，当超过该频度，后续log信息会另存<br />到新文件中，这里的频度包括：MONTHLY（每月）、WEEKLY（每周）、DAILY（每日）、TWICE_DAILY（每两天）、<br />HOURLY（每时）、MINUTELY（每分）。maxBackupIndex的含义同上所述，比如以下代码片段：</pre>
  <pre>    ... ...<br />    <br />    SharedAppenderPtr _append(new DailyRollingFileAppender(&quot;Test.log&quot;, MINUTELY, true, 5));<br />    _append-&gt;setName(&quot;file test&quot;);<br />    _append-&gt;setLayout( std::auto_ptr(new TTCCLayout()) );<br />    Logger::getRoot().addAppender(_append);</pre>
  <pre>    Logger root = Logger::getRoot();<br />    Logger test = Logger::getInstance(&quot;test&quot;);<br />    Logger subTest = Logger::getInstance(&quot;test.subtest&quot;);</pre>
  <pre>    for(int i=0; i    {<br />        NDCContextCreator _context(&quot;loop&quot;);<br />        LOG4CPLUS_DEBUG(subTest, &quot;Entering loop #&quot; &lt;&lt; i)<br />    }<br />    <br />    ... ...</pre>
  <pre>&nbsp;	</pre>
</div>
</body>
</html>
